/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import connection.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.Usuario;

/**
 * Define as regras de manipulação de dados para o banco de usuários;
 * @author Janio Luiz Antunes
 * @author Marcel Vinicius Kohls
 * @see http://code.google.com/p/sysdesk-java/
 *
 */
public class DAOUsuario {
    private final String SQL_ORDER = " ORDER BY usu_nome";
    private final String SQL_LISTA_USUARIOS = "SELECT a.usu_codigo, a.usu_nome, a.usu_funcao, b.cli_nome FROM usuarios a, clientes b WHERE a.usu_cli_codigo = b.cli_codigo AND a.usu_excluido=false";
    private final String SQL_LISTA_USUARIOS_POR_CLIENTE = "SELECT a.usu_codigo, a.usu_nome, a.usu_funcao, b.cli_nome FROM usuarios a, clientes b WHERE a.usu_cli_codigo = b.cli_codigo AND a.usu_excluido=false AND usu_cli_codigo = ?";
    private final String SQL_BUSCA_POR_CODIGO = "SELECT a.*, b.cli_nome FROM usuarios a, clientes b WHERE a.usu_cli_codigo = b.cli_codigo AND a.usu_codigo=?";
    private final String SQL_ALTERAR = "UPDATE usuarios set usu_cli_codigo=?, usu_nome=?, usu_telefone=?, usu_email=?, usu_funcao=? WHERE usu_codigo = ?";
    private final String SQL_INCLUIR = "INSERT INTO usuarios (usu_cli_codigo, usu_nome, usu_telefone, usu_email, usu_funcao, usu_excluido) VALUES (?,?,?,?,?,false)";
    private final String SQL_EXCLUIR = "UPDATE usuarios set usu_excluido=true WHERE usu_codigo=?";

     /**
     * Retorna um resultSet com o resultado do comando de sql da lista de usuarios
     * @return
     * @throws Exception
     */
    public ResultSet getListaUsuarios(int pCodigoCliente, String pNomeUsuario) throws Exception {
        PreparedStatement sqlQuery = null;

        String sqlNomeUsuario = " ";

         //prepara filtro de usuario se desejar
       if (pNomeUsuario != null && pNomeUsuario != "null" && pNomeUsuario.trim().length() > 0) {
           sqlNomeUsuario = " AND usu_nome LIKE \'"+pNomeUsuario+"%\'";
       }

        try {
            if (pCodigoCliente == -1) {
                return Conexao.getStatement().executeQuery(SQL_LISTA_USUARIOS+sqlNomeUsuario+SQL_ORDER);
            } else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_LISTA_USUARIOS_POR_CLIENTE+sqlNomeUsuario+SQL_ORDER);
                sqlQuery.setInt(1,  pCodigoCliente );

                return sqlQuery.executeQuery();
            }
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * retorna uma instancia de categoria a partir de uma busca no sql
     * pelo código passado como parametro.
     * @param pCodCliente
     * @return
     * @throws Exception
     */
    public Usuario getUsuarioPorCodigo(int pCodUsuario) throws Exception {
        PreparedStatement sqlQuery = null;
        ResultSet sqlResult = null;
        Usuario resultadoUsuario = new Usuario();

        try {
            sqlQuery  = Conexao.getConnection().prepareStatement(SQL_BUSCA_POR_CODIGO);
            sqlQuery.setInt(1,  pCodUsuario );
            System.out.println( sqlQuery.toString() );
            sqlResult = sqlQuery.executeQuery();

            resultadoUsuario = getValorDoResultado(sqlResult);

            return resultadoUsuario;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * monta um objeto do tipo usuario, baseado em um retorno de pesquisa de sql em usuarios
     * @param pSqlResult
     * @return
     */
    public Usuario getValorDoResultado(ResultSet pSqlResult) throws Exception {
        Usuario objetoRetorno = new Usuario();

        try {

            // apenas define os campos do objeto se realmente retornou resultado
            if (pSqlResult.next()){
                objetoRetorno.setCodigo(pSqlResult.getInt("usu_codigo"));
                objetoRetorno.setCli_codigo(pSqlResult.getInt("usu_cli_codigo"));
                objetoRetorno.setNome(pSqlResult.getString("usu_nome"));
                objetoRetorno.setTelefone(pSqlResult.getString("usu_telefone"));
                objetoRetorno.setEmail(pSqlResult.getString("usu_email"));
                objetoRetorno.setExcluido(pSqlResult.getBoolean("usu_excluido"));
                objetoRetorno.setFuncao(pSqlResult.getString("usu_funcao"));
                objetoRetorno.setCli_nome(pSqlResult.getString("cli_nome"));
            }

        } catch (Exception e) {
            System.out.println("erro: getValorDoResultado: "+e.getMessage());
        }

        return objetoRetorno;
    }

    /**
     * define a flag de excluido de um usuario.
     * @param pCodigoUsuario
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean excluir(int pCodigoUsuario) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pCodigoUsuario != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_EXCLUIR);

                sqlQuery.setInt(1, pCodigoUsuario);

                System.out.println("DAOUsuario.Excluir:");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }

    /**
     * Salva uma instância de usuario no banco. Se tiver código então é uma alteração,
     * se o código for null, então é inclusão.
     * @param pUsuario
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean salvar(Usuario pUsuario) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pUsuario.getCodigo() != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_ALTERAR);

                sqlQuery.setInt(1, pUsuario.getCli_codigo());
                sqlQuery.setString(2, pUsuario.getNome());
                sqlQuery.setString(3, pUsuario.getTelefone());
                sqlQuery.setString(4, pUsuario.getEmail());
                sqlQuery.setString(5, pUsuario.getFuncao());
                sqlQuery.setInt(6, pUsuario.getCodigo());

                System.out.println("DAOUsuario.Salvar(Alterar):");
                System.out.println(sqlQuery.toString());
            }
            // prepara SQL para incluir
            else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_INCLUIR);

                sqlQuery.setInt(1, pUsuario.getCli_codigo());
                sqlQuery.setString(2, pUsuario.getNome());
                sqlQuery.setString(3, pUsuario.getTelefone());
                sqlQuery.setString(4, pUsuario.getEmail());
                sqlQuery.setString(5, pUsuario.getFuncao());

                System.out.println("DAOUsuario.Salvar(Incluir):");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }

}
